extends Node

const SaveData = preload("res://脚本/对象/save_data.gd")

##背包数据
var 背包数据: Array[ItemData] = []
var 所有物品:AllResource
##灵魂
var 灵魂:int=0

# 添加装备槽位数据
var 装备槽位 = {
	"武器": null,
	"头盔": null,
	"防具": null,
	"护腿": null,
	"靴子": null
}
#属性
var 属性数据={
	"攻击力":0,
	"防御力":0,
	"生命值":0,
}
func _ready():
	# 初始化背包数组，设置默认大小为40个格子
	背包数据.resize(40)
	
	# 将所有格子初始化为null
	for i in range(40):
		背包数据[i] = null
	var 资源路径 = "res://资源/所有资源.tres"
	if ResourceLoader.exists(资源路径):
		所有物品 = ResourceLoader.load(资源路径) as AllResource
		print("成功加载资源：", 所有物品)
	else:
		print("错误：资源文件不存在：", 资源路径)
	# 尝试加载存档
	加载游戏()

# 保存游戏
func 保存游戏():
	var 存档 = SaveData.new()
	存档.设置背包数据(背包数据)
	存档.设置灵魂(灵魂)
	# 保存到文件
	var 错误 = ResourceSaver.save(存档, "user://save_game.tres")
	if 错误 == OK:
		print("游戏已保存，当前背包数据：", 背包数据)
	else:
		push_error("保存游戏失败")

# 加载游戏
func 加载游戏():
	if not FileAccess.file_exists("user://save_game.tres"):
		print("没有找到存档文件")
		return
	
	var 存档 = ResourceLoader.load("user://save_game.tres") as SaveData
	if 存档:
		var 加载数据 = 存档.获取背包数据()
		灵魂 = 存档.获取灵魂()
		背包数据.clear()
		背包数据.resize(40)
		
		for i in range(40):
			if 加载数据[i] != null:
				背包数据[i] = 加载数据[i]
			else:
				背包数据[i] = null
				
		print("游戏已加载，当前背包数据：", 背包数据)
	else:
		push_error("加载游戏失败或存档数据为空")

# 添加物品到背包
func 添加物品(物品) -> bool:
	# 先查找已有的同类物品堆叠
	if 物品.is_stackable:
		for i in range(40):
			if 背包数据[i] != null and 背包数据[i].name == 物品.name:
				物品.index = i
				背包数据[i].count += 物品.count
				return true
	
	# 找空位放置
	for i in range(40):
		if 背包数据[i] == null:
			print("添加物品：",物品)
			物品.index = i
			背包数据[i] = 物品.duplicate(true)
			return true
	
	return false

# 从背包移除物品
func 移除物品(格子序号: int):
	if 格子序号 >= 0 and 格子序号 < 40:
		背包数据[格子序号] = null

# 获取指定格子的物品
func 获取物品(格子序号: int) -> ItemData:
	if 格子序号 >= 0 and 格子序号 < 40:
		return 背包数据[格子序号]
	return null

#出售物品
func 出售物品(物品,数量:int=1):
	if 物品:
		# 获取物品价格
		var 出售价格 = 物品.price * 数量
		
		# 增加灵魂
		灵魂 += 出售价格
		
		# 从背包中移除物品
		var 出售数量 =数量  # 保存要出售的数量
		for sj in 背包数据.size():
			if 背包数据[sj] != null and 背包数据[sj].name == 物品.name:
				if 背包数据[sj].count > 出售数量:
					背包数据[sj].count -= 出售数量
					break
				else:
					背包数据[sj] = null
					break
		
		print("出售物品：", 物品.name, " 获得：", 出售价格, "灵魂")
		print("当前灵魂：", 灵魂)
		
		# 如果背包界面存在，刷新显示
		if Ui.背包数据:
			Ui.背包数据.refresh_bag()

# 装备物品
func 装备物品(装备: EquipmentData) -> bool:
	if not 装备 or 装备.is_locked:
		return false
		
	# 如果该槽位已有装备，先卸下
	if 装备槽位[装备.slot]:
		卸下装备(装备槽位[装备.slot])
	
	# 装备新物品
	装备槽位[装备.slot] = 装备
	装备.is_equipped = true
	
	# 从背包中移除
	背包数据[装备.index] = null
	
	# 刷新背包显示
	if Ui.背包数据:
		Ui.背包数据.refresh_bag()
	
	print("装备：", 装备.name)
	var text_0="VBoxContainer/HBoxContainer/装备/"+装备.slot
	属性数据["攻击力"]+=装备.base_attack
	属性数据["防御力"]+=装备.base_defense
	属性数据["生命值"]+=装备.base_health
	Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/攻击").text="攻击力:"+str(属性数据["攻击力"])
	Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/防御").text="防御力:"+str(属性数据["防御力"])
	Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/血量").text="血量:"+str(属性数据["生命值"])
	Ui.背包数据.get_node(text_0).set_item(装备)
	return true

# 卸下装备
func 卸下装备(装备: EquipmentData) -> bool:
	if not 装备 or 装备.is_locked:
		return false
	
	# 找一个空格子放装备
	for i in range(40):
		if 背包数据[i] == null:
			装备.is_equipped = false
			装备.index = i
			背包数据[i] = 装备
			装备槽位[装备.slot] = null
			
			# 刷新背包显示
			if Ui.背包数据:
				Ui.背包数据.refresh_bag()
			
			print("卸下：", 装备.name)
			var text_0="VBoxContainer/HBoxContainer/装备/"+装备.slot
			属性数据["攻击力"]-=装备.base_attack
			属性数据["防御力"]-=装备.base_defense
			属性数据["生命值"]-=装备.base_health
			Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/攻击").text="攻击力:"+str(属性数据["攻击力"])
			Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/防御").text="防御力:"+str(属性数据["防御力"])
			Ui.背包数据.get_node("VBoxContainer/HBoxContainer/属性/VBoxContainer/血量").text="血量:"+str(属性数据["生命值"])
			Ui.背包数据.get_node(text_0).set_item(装备)
			Ui.背包数据.get_node(text_0).set_item(null)
			return true
	
	print("背包已满，无法卸下装备")
	return false
##装备放入炼丹炉
func 装备放入炼丹炉(data):
	if Ui.炼丹炉状态==0:
		##如果是装备
		if data is EquipmentData:
			##针对装备的格子
			var node=Ui.炼丹炉数据.get_node("TabContainer/强化/装备")
			data.is_in_furnace=true
			Ui.炼丹炉装备格子数据=data.duplicate(true)
			node.set_item(Ui.炼丹炉装备格子数据)
			Cd.移除物品(data.index)
##装备从炼丹炉中取出装备
func 装备从炼丹炉中取出(data):
	if Ui.炼丹炉状态==0:
		##如果是装备
		if data is EquipmentData:
			##如果在炼丹炉中,则从炼丹炉中取出
			var node=Ui.炼丹炉数据.get_node("TabContainer/强化/装备")
			node.set_item(null)
			data.is_in_furnace=false
			Ui.炼丹炉装备格子数据=null
			##将物品添加到背包
			Cd.添加物品(data.duplicate(true))
##材料从炼丹炉中取出
func 材料从炼丹炉中取出(data):
	if Ui.炼丹炉状态==0:
		##如果是强化石
		if data is StrengthenStone:
			##强化石的格子
			var node=Ui.炼丹炉数据.get_node("TabContainer/强化/HBoxContainer/强化石")
			node.set_item(null)
			data.is_in_furnace=false
			Ui.炼丹炉强化石格子数据=null
			##将物品添加到背包
			Cd.添加物品(data.duplicate(true))
##材料放入炼丹炉
func 材料放入炼丹炉(data):
	if Ui.炼丹炉状态==0:
		##如果是强化石
		if data is StrengthenStone:
			##强化石的格子
			var node=Ui.炼丹炉数据.get_node("TabContainer/强化/HBoxContainer/强化石")
			if Ui.炼丹炉强化石格子数据==null:
				背包数据[data.index].count-=1
				if 背包数据[data.index].count==0:
					背包数据[data.index]=null
				Ui.炼丹炉强化石格子数据=data.duplicate(true)
				Ui.炼丹炉强化石格子数据.index=-1
				Ui.炼丹炉强化石格子数据.count=1
				node.set_item(Ui.炼丹炉强化石格子数据)
			else:
				if Ui.炼丹炉强化石格子数据.name==data.name:
					背包数据[data.index].count-=1
				if 背包数据[data.index].count<=0:
					背包数据[data.index]=null
				Ui.炼丹炉强化石格子数据.count+=1
				Ui.炼丹炉强化石格子数据.index=-1
				node.set_item(Ui.炼丹炉强化石格子数据)
			#Cd.移除物品(data.index)
			#背包数据
##放进合成格子
func 放进合成格子(data):
	var j=0
	if Ui.炼丹炉状态==1:
		for i in 3:
			if Ui.炼丹炉合成格子数据[i]==null:
				##如果是装备
				var bl="TabContainer/合成/HBoxContainer/"+str(i)
				if i==0:
					bl="TabContainer/合成/HBoxContainer2/"+str(i)
				var node=Ui.炼丹炉数据.get_node(bl)
				var 数据=data.duplicate(true)
				if 数据 is EquipmentData:
					数据.is_in_furnace=true
					Cd.背包数据[数据.index]=null
				else:
					Cd.背包数据[数据.index].count-=1
					if Cd.背包数据[数据.index].count<=0:
						Cd.背包数据[数据.index]=null
					数据.index=-1
					数据.count=1
				Ui.炼丹炉合成格子数据[i]=数据.duplicate(true)
				node.set_item(Ui.炼丹炉合成格子数据[i])
				j+=1
			if j==1:break
##拿出合成格子					
func 拿出合成格子(i):
	if Ui.炼丹炉状态==1:
		if i>=0 and i<3:
			if Ui.炼丹炉合成格子数据[i]!=null:
				var bl="TabContainer/合成/HBoxContainer/"+str(i)
				if i==0:
					bl="TabContainer/合成/HBoxContainer2/"+str(i)
				var node=Ui.炼丹炉数据.get_node(bl)
				node.set_item(null)
				Cd.添加物品(Ui.炼丹炉合成格子数据[i])
				Ui.炼丹炉合成格子数据[i]=null
		else:
			var node=Ui.炼丹炉数据.get_node("TabContainer/合成/HBoxContainer/3")
			node.set_item(null)
			Cd.添加物品(Ui.炼丹炉合成好的数据.duplicate(true))
			Ui.炼丹炉合成好的数据=null
func 合成循环(name):
	if Ui.炼丹炉合成格子数据[0]!=null and Ui.炼丹炉合成格子数据[1]!=null and Ui.炼丹炉合成格子数据[2]!=null:
		for i in 3:
			if Ui.炼丹炉合成格子数据[i].name!=name:
				return false
	return true
##清空合成格子
func 清空合成格子():
	for i in 3:
		var bl="TabContainer/合成/HBoxContainer/"+str(i)
		if i==0:
			bl="TabContainer/合成/HBoxContainer2/"+str(i)
		var node=Ui.炼丹炉数据.get_node(bl)
		node.set_item(null)
		Ui.炼丹炉合成格子数据[i]=null
func 合成数据():
	if Ui.炼丹炉合成好的数据!=null:
		Ui.炼丹炉合成好的数据.count=1
		if Ui.炼丹炉合成好的数据 is EquipmentData:
			Ui.炼丹炉合成好的数据.is_in_furnace=false
		else:
			Ui.炼丹炉合成好的数据.index=-1
		var node=Ui.炼丹炉数据.get_node("TabContainer/合成/HBoxContainer/3")
		node.set_item(Ui.炼丹炉合成好的数据)

##合成功能
func 合成():
	if Ui.炼丹炉状态==1:
		if Ui.炼丹炉合成格子数据[0]!=null and Ui.炼丹炉合成格子数据[1]!=null and Ui.炼丹炉合成格子数据[2]!=null:
			if 合成循环("一级强化石"):
				清空合成格子()
				Ui.炼丹炉合成好的数据=Cd.所有物品.strengthen_stone_data[1].duplicate(true)
			elif 合成循环("二级强化石"):
				清空合成格子()
				Ui.炼丹炉合成好的数据=Cd.所有物品.strengthen_stone_data[2].duplicate(true)
			elif 合成循环("三级强化石"):
				清空合成格子()
				Ui.炼丹炉合成好的数据=Cd.所有物品.strengthen_stone_data[3].duplicate(true)
			合成数据()